perm filename TENSOR.SAI[CRE,BGB] blob
sn#039860 filedate 1973-05-03 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
RECORD PAGE DESCRIPTION
00001 00001 VALID 00007 PAGES
00002 00002 BEGIN "TENSOR"
00003 00003 SUBR ACC ! ACCUMULATE PORTIONS
00004 00004 SUBR TRI (ITG V1,V2) ! TRIANGULAR PORTION
00005 00005 SUBR DPYGON
00007 00006 SUBR ROTATE (REAL THETA)
00009 00007 A1 ← 60*88
00010 ENDMK
⊗;
BEGIN "TENSOR"
REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
REQUIRE "DPYIII[SYS,BGB]" SOURCE_FILE;
REQUIRE "SAITRG[SYS,BGB]" SOURCE_FILE;
SAFE ITG ARRAY DPYBUF[0:500];
PRELOAD_WITH 60,120,120,60;
REAL ARRAY ROW [1:4];
PRELOAD_WITH 100,100,188,188;
REAL ARRAY COL [1:4];
DEFINE NCNT="4";
REAL DR,DC,R1,R2,C1,C2;
REAL A, X, Y, MXX, MYY, PXY; ! PARTIALS;
REAL A0,X0,Y0,MXX0,MYY0,PXY0; ! ACCUMULATORS;
REAL A1,X1,Y1,MXX1,MYY1,PXY1; ! FIRST INERTIA TENSOR;
REAL A2,X2,Y2,MXX2,MYY2,PXY2; ! SECOND INERTIA TENSOR;
REAL MZZ,MZZ0,MZZ1,MZZ2;
REAL PHI1,PHI2,CPHI1,SPHI1;
SUBR ACC; ! ACCUMULATE PORTIONS;
BEGIN "ACC"
A0 ← A0 +A;
X0 ← X0 + A*X;
Y0 ← Y0 + A*Y;
MXX0 ← MXX0 + MXX + Y*Y*A;
MYY0 ← MYY0 + MYY + X*X*A;
PXY0 ← PXY0 + PXY - X*Y*A;
END "ACC";
SUBR TOT; ! TOTAL INTERTIA;
BEGIN "TOT"
A2 ← A0;
X1 ← X0/A0;
Y1 ← Y0/A0;
OUTSTR(9&CVS(X1)&9&CVS(Y1)&↓);
MXX2 ← MXX0 - Y1*Y1*A0;
MYY2 ← MYY0 - X1*X1*A0;
PXY2 ← PXY0 + X1*Y1*A0;
END "TOT";
SUBR TRI (ITG V1,V2); ! TRIANGULAR PORTION;
BEGIN "TRI"
R1 ← ROW[V1]; R2 ← ROW[V2];
C1 ← COL[V1]; C2 ← COL[V2];
DC ← C2 - C1;
DR ← R2 - R1;
A ← DC*DR/2;
X ← (2*C2+C1)/3;
Y ← (2*R1+R2)/3;
MXX ← A*DR*DR/18;
MYY ← A*DC*DC/18;
PXY ← -A*A/18;
ACC;
END "TRI";
SUBR REC (ITG V1,V2); ! RECTANGULAR PORTION;
BEGIN "REC"
R1 ← ROW[V1]; R2 ← ROW[V2];
C1 ← COL[V1]; C2 ← COL[V2];
DC ← C2 - C1;
DR ← R2 - R1;
A ← DC*R1;
X ← (C1+C2)/2;
Y ← R1/2;
MXX ← A*R1*R1/12;
MYY ← A*DC*DC/12;
PXY ← 0;
ACC;
END "REC";
SUBR DPYGON;
BEGIN "DPYGON"
ITG I,X,Y;
! DISPLAY BORDER;
DPYSET(DPYBUF);
AIVECT(-500,-500);
AVECT(+500,-500);
AVECT(+500,+500);
AVECT(-500,+500);
AVECT(-500,-500);
! DISPLAY RECTANGLE;
BEGIN
X ← 3.5*(COL[NCNT]-144);
Y ← 3.5*(108-ROW[NCNT]);
AIVECT(X,Y);
END;
FOR I←1 TIL NCNT DO
BEGIN
X ← 3.5*(COL[I]-144);
Y ← 3.5*(108-ROW[I]);
AVECT(X,Y);
END;
! DISPLAY FIRST AND SECOND FORMS OF THE INERTIA TENSOR;
AIVECT(-450,400);DPYSST(CVG(MXX1));
AIVECT(-450,370);DPYSST(CVG(MXX2));
AIVECT(-250,400);DPYSST(CVG(MYY1));
AIVECT(-250,370);DPYSST(CVG(MYY2));
AIVECT(-75,400);DPYSST(CVG(MZZ1));
AIVECT(-75,370);DPYSST(CVG(MZZ2));
AIVECT(+100,400);DPYSST(CVG(PXY1));
AIVECT(+100,370);DPYSST(CVG(PXY2));
AIVECT(+300,400);DPYSST(CVG(A1));
AIVECT(+300,370);DPYSST(CVG(A2));
AIVECT(0,18*3.5);AVECT(CPHI1*100,18*3.5+SPHI1*100);
DPYOUT(0);
INCHRW;
END "DPYGON";
SUBR ROTATE (REAL THETA);
BEGIN "ROTATE"
ITG I;REAL X,Y,C,S,TMP;
C ← COS(THETA);
S ← SIN(THETA);
FOR I←1 TIL NCNT DO
BEGIN
X ← COL[I] - 144;
Y ← 90 - ROW[I];
TMP ← C*X - S*Y;
Y ← C*Y + S*X;
X ← TMP;
ROW[I] ← (90 - Y);
COL[I] ← (X + 144);
END;
MXX0 ← C*C*MXX1 + S*S*MYY1 + 2*C*S*PXY1;
MYY0 ← C*C*MYY1 + S*S*MXX1 - 2*C*S*PXY1;
PXY1 ← (C*C - S*S)*PXY1 + C*S*(MYY1-MXX1);
MXX1 ← MXX0; MYY1 ← MYY0; MZZ1 ← MXX1 + MYY1;
A0←X0←Y0←MXX0←MYY0←PXY0←0; ! ACCUMULATORS;
TRI(1,2);REC(1,2);
TRI(2,3);REC(2,3);
TRI(3,4);REC(3,4);
TRI(4,1);REC(4,1);
TOT; MZZ2 ← MXX2 + MYY2;
PHI1 ← ATAN2(2*PXY1,MYY1-MXX1)/2;
CPHI1 ← COS(PHI1);
SPHI1 ← SIN(PHI1);
END "ROTATE";
A1 ← 60*88;
MXX1 ← A1*60*60/12;
MYY1 ← A1*88*88/12;
PXY1 ← 0;
ROTATE(0);
WHILE TRUE DO
BEGIN "FOREVER"
DPYGON;
ROTATE(π/8);
END "FOREVER";
END "TENSOR";